//配置路由模板
//引入路由
import {createRouter, createWebHashHistory, createWebHistory,} from "vue-router";

//引入http.js模块
import {http} from "../utils/http.js";

const modules = import.meta.glob("../views/**/**.vue");

//定义保存权限的key
const USER_PRIVS_KEY = "erp_privs";

//引入模块session
import session from "../utils/session.js";

//引入组件
const Login = () => import("@/views/common/Login.vue");
const MainFrame = () => import("@/views/common/MainFrame.vue");
const NotFound = () => import("@/views/common/404.vue");

//配置路由信息
const routes = [
    {
        path: "/",
        component: Login,
        meta: {
            title: "ERP管理系统",
        },
    },
    {
        path: "/main",
        component: MainFrame,
        children: [
            {
                path: "/home",
                component: () => import("@/views/analyse/Home.vue")
            }
        ],
    },
];




//创建路由实例
let router = createRouter({
    history: createWebHashHistory(),
    routes, //等同于  "routes":routes
});

if(sessionStorage.getItem('erp_privs')){
    console.log("===",JSON.parse(sessionStorage.getItem('erp_privs')))
    //解析配置动态路由
    dynacRouter(JSON.parse(sessionStorage.getItem('erp_privs')));
}

//查询权限
function queryAuth(roleId, next) {
    http.get("/api/menu/auth", {roleId}).then((res) => {
        if (res.code === 200) {
            //将授权字符串保存到会话中
            sessionStorage.setItem("erp_auths", res.result.auths);
            //获取导航菜单
            let menus = res.result.menus;
            //先保存菜单到会话中
            sessionStorage.setItem(USER_PRIVS_KEY, JSON.stringify(menus));
            //解析配置动态路由
            dynacRouter(menus);
            //直接跳转
            next();
        }
    });
}

//解析路由
function dynacRouter(menus) {
    let obj = router.options.routes[1];
    //存储所有路由
    //遍历menus
    menus.forEach((m) => {
        //m 模块对象
        //遍历模块下的页面
        m.children.forEach((page) => {
            //根据当前对象生成路由配置
            let com = modules[`../views${page.component}`];
            let dir = page.component.replaceAll("/", "");
            let end = dir.lastIndexOf(".");
            let name = dir.substring(0, end);
            let tmp = {
                path: page.path,
                component: com,
                name: name,
                meta: {
                    title: "ERP管理",
                },
            };
            //添加新的路由
            router.addRoute(obj, tmp);
            obj.children.push(tmp);
        });
    });

    //添加新的路由
    let tmp = {
        path: "*",
        component: NotFound,
        meta: {
            title: "404找不到",
        },
    };
    router.addRoute(obj, tmp);
    obj.children.push(tmp);
}

//全局前置守卫
router.beforeEach((to, from, next) => {
    document.title = to.meta.title;
    //判断当前目标地址是否是登录页面
    if (to.path === "/") {
        //说明访问的是登录页面 直接 跳转
        next();
    }
    //获取用户信息
    let user = session.getUser();
    //判断用户是否登录
    if (user.id) {
        //用户存在 直接跳转
        //先判断当前用户是否已加载权限  如果加载  直接跳转 没有的话  先查询权限
        //1.从sessionStorage中获取权限信息
        let tmp = sessionStorage.getItem(USER_PRIVS_KEY);
        console.log(tmp)
        //判断tmp是否存在
        if (tmp) {
            //判断页面是否刷新 因为刷新后 router数组中第二项 的children数据丢失  需要重新配置
            if (router.options.routes[1].children.length === 0) {
                //重新解析路由
                dynacRouter(JSON.parse(tmp));
                //next({ ...to, replace: true })可以写成next({ ...to })
                //如果参数to不能找到对应的路由的话，就再执行一次beforeEach((to, from, next)直到其中的next({ ...to})能找到对应的路由为止。
                next({
                    ...to,
                    replace: true,
                });
            } else {
                //说明权限已加载   直接跳转
                next();
            }
        } else {
            //不存在 没有权限  查询权限
            queryAuth(user.roleId, next);
        }
    } else {
        //用户不存在 停止跳转
        next("/"); //跳回登录页面
    }
});

export default router;
